/* Producción - Reservar y comprar - Selección */

package edu.client;

import java.util.Date;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.datepicker.client.DateBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.OrdenFabricacionGeneralDTO;

public class P_ReservarYComprarSeleccion extends Composite {
	
	private String tituloTab;
	TabPanel padre;
	
	//columnas de la tabla órdenes de fabricación
	private static final int COL_CHECK = 0;
	private static final int COL_NRO_ORDEN = 1;
	private static final int COL_ESTADO = 2;
	private static final int COL_FECHA_ESTIMADA_INICIO = 3;
	private static final int COL_FECHA_ESTIMADA_FINALIZACION = 4;
	private static final int COL_MAS_INFO = 5;
	
	private ListBox cbEstados;
	private DateBox dbFechaEstimadaInicio;
	private DateBox dbFechaEstimadaFinalizacion;
	private FlexTable ftOrdenesFabricacion;
	
	private IngenieriaServiceAsync ingenieriaService;
	List<OrdenFabricacionGeneralDTO> ordenes;
	
	public P_ReservarYComprarSeleccion(TabPanel padre, String titulo)
	{
		
		this.tituloTab = titulo;
		this.padre = padre;
		
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "670px");
		
		Label lblFiltrarPor = new Label("FILTROS");
		lblFiltrarPor.setStyleName("labelTitulo");
		layoutPanel.add(lblFiltrarPor);
		layoutPanel.setWidgetLeftWidth(lblFiltrarPor, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFiltrarPor, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblEstado = new Label("ESTADO:");
		lblEstado.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(lblEstado);
		lblEstado.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.setWidgetLeftWidth(lblEstado, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblEstado, 80.0, Unit.PX, 19.0, Unit.PX);	
		
		cbEstados = new ListBox();
		layoutPanel.add(cbEstados);
		layoutPanel.setWidgetLeftWidth(cbEstados, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cbEstados, 75.0, Unit.PX, 32.0, Unit.PX);
		
		//agregamos las opciones al combobox
		cbEstados.addItem("TODOS LOS ESTADOS");
		cbEstados.addItem("GENERADA");
		cbEstados.addItem("PROVISORIA");
		
		Label lblFechaEstimadaInicio = new Label("FECHA ESTIMADA DE INICIO:");
		lblFechaEstimadaInicio.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblFechaEstimadaInicio);
		layoutPanel.setWidgetLeftWidth(lblFechaEstimadaInicio, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFechaEstimadaInicio, 80.0, Unit.PX, 19.0, Unit.PX);
		
		dbFechaEstimadaInicio = new DateBox();
		dbFechaEstimadaInicio.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
		layoutPanel.add(dbFechaEstimadaInicio);
		layoutPanel.setWidgetLeftWidth(dbFechaEstimadaInicio, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(dbFechaEstimadaInicio, 75.0, Unit.PX, 32.0, Unit.PX);
		
		Label lblFechaEstimadaFinalizacion = new Label("FECHA ESTIMADA DE FINALIZACIÓN:");
		lblFechaEstimadaFinalizacion.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.add(lblFechaEstimadaFinalizacion);
		layoutPanel.setWidgetLeftWidth(lblFechaEstimadaFinalizacion, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFechaEstimadaFinalizacion, 125.0, Unit.PX, 19.0, Unit.PX);
		
		dbFechaEstimadaFinalizacion = new DateBox();
		dbFechaEstimadaFinalizacion.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy")));
		layoutPanel.add(dbFechaEstimadaFinalizacion);
		layoutPanel.setWidgetLeftWidth(dbFechaEstimadaFinalizacion, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(dbFechaEstimadaFinalizacion, 120.0, Unit.PX, 32.0, Unit.PX);
		
		Button btnFiltrar = new Button();
		btnFiltrar.setText("BUSCAR");
		
		//al presionar el botón filtrar
		btnFiltrar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cargarOrdenesFabricacion();
			}
		});
		
		layoutPanel.add(btnFiltrar);
		layoutPanel.setWidgetLeftWidth(btnFiltrar, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnFiltrar, 180.0, Unit.PX, 28.0, Unit.PX);
		
		Label lblOrdenesFabricacion = new Label("ÓRDENES DE FABRICACIÓN");
		lblOrdenesFabricacion.setStyleName("labelTitulo");
		layoutPanel.add(lblOrdenesFabricacion);
		layoutPanel.setWidgetLeftWidth(lblOrdenesFabricacion, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblOrdenesFabricacion, 230.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spOrdenes = new ScrollPanel();
		spOrdenes.setStyleName("tabla");
		layoutPanel.add(spOrdenes);
		layoutPanel.setWidgetLeftWidth(spOrdenes, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spOrdenes, 310.0, Unit.PX, 250.0, Unit.PX);
		
		ftOrdenesFabricacion = new FlexTable();
		spOrdenes.setWidget(ftOrdenesFabricacion);
		ftOrdenesFabricacion.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla	
		
		// columna check
		ftOrdenesFabricacion.setText(0, COL_CHECK, "");
		ftOrdenesFabricacion.getCellFormatter().setWidth(0, COL_CHECK, "4%");
		
		// columna número orden de fabricación
		ftOrdenesFabricacion.setText(0, COL_NRO_ORDEN, "N° ORDEN FABRICACIÓN");
		ftOrdenesFabricacion.getCellFormatter().setWidth(0, COL_NRO_ORDEN, "24%");
		
		// columna estado
		ftOrdenesFabricacion.setText(0, COL_ESTADO, "ESTADO");
		ftOrdenesFabricacion.getCellFormatter().setWidth(0, COL_ESTADO, "24%");
		
		// columna fecha estimada inicio
		ftOrdenesFabricacion.setText(0, COL_FECHA_ESTIMADA_INICIO, "FECHA ESTIMADA INICIO");
		ftOrdenesFabricacion.getCellFormatter().setWidth(0, COL_FECHA_ESTIMADA_INICIO, "19%");
		
		// columna fecha estimada finalización
		ftOrdenesFabricacion.setText(0, COL_FECHA_ESTIMADA_FINALIZACION, "FECHA ESTIMADA FINALIZACIÓN");
		ftOrdenesFabricacion.getCellFormatter().setWidth(0, COL_FECHA_ESTIMADA_FINALIZACION, "19%");
		
		// columna fecha estimada finalización
		ftOrdenesFabricacion.setText(0, COL_MAS_INFO, "+ INFO");
		ftOrdenesFabricacion.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
				
		// seteamos el estilo a los encabezados
		ftOrdenesFabricacion.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label lblPie = new Label("");
		lblPie.setStyleName("labelTitulo");
		layoutPanel.add(lblPie);
		layoutPanel.setWidgetLeftWidth(lblPie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblPie, 560.0, Unit.PX, 50.0, Unit.PX);
		
		Button especificarBtn = new Button("ESPECIFICAR");
		layoutPanel.add(especificarBtn);
		layoutPanel.setWidgetRightWidth(especificarBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(especificarBtn, 630.0, Unit.PX, 28.0, Unit.PX);
		
		especificarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				String codigoOrdenSeleccionada = ordenSeleccionada();
				
				// si no hay una orden de fabricación seleccionada
				if (codigoOrdenSeleccionada == null) {
					Window.alert("Seleccione una orden de fabricación.");
				}
				
				else {
					
					OrdenFabricacionGeneralDTO ordenSeleccionada = buscarOrden(codigoOrdenSeleccionada);
					
					especificarReservasYCompras(ordenSeleccionada);
				}
			}
		});
		
		Button btnSalir = new Button("");
		btnSalir.setText("CANCELAR");
		
		//al presionar el botón salir
		btnSalir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				salir(event);
			}
		});
		
		layoutPanel.add(btnSalir);
		layoutPanel.setWidgetRightWidth(btnSalir, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnSalir, 630.0, Unit.PX, 28.0, Unit.PX);
		
		cargarOrdenesFabricacion();
	}

	/**
	 * Método que busca en la base de datos todas las órdenes de fabricación y las carga en la tabla
	 */
	private void cargarOrdenesFabricacion()
	{
		//se utiliza para formatear fechas
		final DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
		
		//recuperamos el estado seleccionado en el combobox de estados
		String estado = cbEstados.getItemText(cbEstados.getSelectedIndex());
		Date fechaEstimadaInicio = dbFechaEstimadaInicio.getValue();
		Date fechaEstimadaFinalizacion = dbFechaEstimadaFinalizacion.getValue();
			
		ingenieriaService.filtrarOrdenesFabricacion(estado, fechaEstimadaInicio, fechaEstimadaFinalizacion, true, new AsyncCallback<List<OrdenFabricacionGeneralDTO>>()
		{

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());
			}

			@Override
			public void onSuccess(List<OrdenFabricacionGeneralDTO> result) {
				
				ordenes = result;
							
				// primero se eliminan las filas.
				int cantidadFilasEliminar = ftOrdenesFabricacion.getRowCount() - 1;
				for (int i=cantidadFilasEliminar; i > 0 ; i--) {
					ftOrdenesFabricacion.removeRow(i);
				}
						
				if(ordenes.size() == 0)
					Window.alert("No existen órdenes de fabricación que cumplan con los criterios de búsqueda.");
				
				// cargamos las órdenes a la tabla
				for (int i = 0; i < ordenes.size(); i++) {
	
					OrdenFabricacionGeneralDTO orden = ordenes.get(i);
					
					// columna para selección
					
					RadioButton radioButton = new RadioButton("seleccion");						
					ftOrdenesFabricacion.setWidget(i + 1, COL_CHECK, radioButton);
					ftOrdenesFabricacion.getFlexCellFormatter().setHorizontalAlignment(i + 1, COL_CHECK, HasHorizontalAlignment.ALIGN_CENTER);		
									
					//columna número orden
					ftOrdenesFabricacion.setWidget(i + 1, COL_NRO_ORDEN, new Label(String.valueOf(orden.getNroOrden())));
					ftOrdenesFabricacion.getCellFormatter().setWordWrap(i + 1, COL_NRO_ORDEN, true);
					
					// columna estado
					ftOrdenesFabricacion.setWidget(i + 1, COL_ESTADO, new Label(orden.getEstado()));
					ftOrdenesFabricacion.getCellFormatter().setWordWrap(i + 1, COL_ESTADO, true);
			
					// columna fecha estimada de inicio
					if(orden.getFechaPrevistaInicio() != null) {
						ftOrdenesFabricacion.setWidget(i + 1, COL_FECHA_ESTIMADA_INICIO, new Label(String.valueOf(formatoFecha.format(orden.getFechaPrevistaInicio()))));
						ftOrdenesFabricacion.getCellFormatter().setWordWrap(i + 1, COL_FECHA_ESTIMADA_INICIO, true);
					}
			
					// columna fecha estimada de finalización
					if(orden.getFechaPrevistaFinalizacion() != null) {
						ftOrdenesFabricacion.setWidget(i + 1, COL_FECHA_ESTIMADA_FINALIZACION, new Label(String.valueOf(formatoFecha.format(orden.getFechaPrevistaFinalizacion()))));
						ftOrdenesFabricacion.getCellFormatter().setWordWrap(i + 1, COL_FECHA_ESTIMADA_FINALIZACION, true);
					}
			
					
					// imagen más información
					Label info = new Label("");
					info.setSize("16px", "16px");
					info.setStyleName("labelInfo");
					
					//cuando se presiona "más información"
					info.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							//obtenemos la celda en donde se hizo click
							Cell celda = ftOrdenesFabricacion.getCellForEvent(event);
							
							//obtenemos la orden de fabricación. Restamos 1 al row index porque la fila 1 es el encabezado
							OrdenFabricacionGeneralDTO orden = ordenes.get(celda.getRowIndex() - 1);
							
							cargarMasInformacionOrdenFabricacion(orden);
						}
					});
					
					// columna más información
					ftOrdenesFabricacion.setWidget(i + 1, COL_MAS_INFO, info);
					ftOrdenesFabricacion.getFlexCellFormatter().setHorizontalAlignment(i + 1, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
					
					//seteamos el estilo de renglón de tabla
					ftOrdenesFabricacion.getRowFormatter().setStyleName(i + 1, "tablaRenglon");

				}		
			}
		});			
	}
	
	private void cargarMasInformacionOrdenFabricacion(OrdenFabricacionGeneralDTO orden)
	{
		//creamos el popup "más información" de la orden de fabricación
		final P_DetalleOrdenFabricacion popUpMasInfo = new P_DetalleOrdenFabricacion(orden);
		
		//seteamos sus propiedades y la mostramos en pantalla
		popUpMasInfo.setGlassEnabled(true);
		popUpMasInfo.center();
		popUpMasInfo.show();
	}
	
	private String ordenSeleccionada() {
		
		String codigoOrdenSeleccionada = null;

		for (int i=1; i < ftOrdenesFabricacion.getRowCount() && codigoOrdenSeleccionada == null; i++) {
			
			RadioButton radioButton = (RadioButton) ftOrdenesFabricacion.getWidget(i, COL_CHECK);
			
			if (radioButton.getValue() == true) { 
				codigoOrdenSeleccionada = ftOrdenesFabricacion.getText(i, COL_NRO_ORDEN);
			}
		}
		
		return codigoOrdenSeleccionada;
	}
	
	protected OrdenFabricacionGeneralDTO buscarOrden(String codigoOrdenSeleccionada) {
		
		OrdenFabricacionGeneralDTO ordenSeleccionada = null;
		
		for (OrdenFabricacionGeneralDTO o: ordenes) {
			
			if (codigoOrdenSeleccionada.equals(String.valueOf(o.getNroOrden()))) {
				ordenSeleccionada = o;
			}
		}
		
		return ordenSeleccionada;
	}
	
	public void especificarReservasYCompras(OrdenFabricacionGeneralDTO ordenSeleccionada) {
		
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_ReservarYComprar pReservarYComprar= new P_ReservarYComprar(padre, tituloTab, ordenSeleccionada);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(pReservarYComprar);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++) {
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	}
	
	public void salir(ClickEvent event) {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}

